package upc.dew.inscripcionalumnos.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import upc.dew.inscripcionalumnos.model.Documento;
import upc.dew.inscripcionalumnos.model.Estado;
import upc.dew.inscripcionalumnos.model.Modalidad;
import upc.dew.inscripcionalumnos.model.Postulante;
import upc.dew.inscripcionalumnos.model.Requisito;

public class FileController extends BaseController
{
    private static final String PARAMETRO_ACCION = "accion";
    private static final String ACCION_CARGAR = "cargar";
    private static final String ACCION_DESCARGAR = "descargar";
    private static final String ACCION_VER_REQUISITOS_MODALIDAD = "verRequisitos";

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception
    {
        if(esAccionCargar(request))
        {
            return uploadFile(request, response);
        }
        else if(esAccionDescargar(request))
        {
            return downloadFile(request, response);
        }
        else if(esAccionVerRequisitosModalidad(request))
        {
             return obtenerRequisitosPorModalidad(request, response);
        }

        return new ModelAndView("cargaArchivo");
    }

    private ModelAndView uploadFile(HttpServletRequest request, HttpServletResponse response) throws Exception
    {
        if(!(request instanceof MultipartHttpServletRequest))
        {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Expected multipart request");
        }

        String postulanteDir = request.getParameter("usuario");
        String codigoPostulante = request.getParameter("codigoPostulante");

        Postulante postulante = (Postulante) getAttributeFromSession(request, "postulante");
        String folder = postulante.getCodigoPostulante() + "-" + postulante.getApellidoPaterno().concat(postulante.getApellidoMaterno());

        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        MultipartFile file = multipartRequest.getFile("archivo");

        Documento documento = new Documento();
        documento.setCodigoPostulante(Integer.parseInt(codigoPostulante));
        documento.setNombre(file.getOriginalFilename());
        documento.setRuta(getFilesDirectory().concat(folder).concat("/").concat(file.getOriginalFilename()));

        getPostulanteService().registrarDocumento(documento);
        file.transferTo(new File(getFilesDirectory().concat(folder), file.getOriginalFilename()));        
        postulante.setEstado(Estado.ENVIADO);

        getPostulanteService().registrarPostulante(postulante);

        return new ModelAndView("postulante_Fase_2_Confirmacion");
    }

    private ModelAndView downloadFile(HttpServletRequest request, HttpServletResponse response) throws Exception
    {
        String codigoPostulante = request.getParameter("codigoPostulante");
        Documento documento = getPostulanteService().obtenerDocumento(Integer.parseInt(codigoPostulante));

        File f = new File(documento.getRuta());
        FileInputStream fis = new FileInputStream(f);
        OutputStream os = response.getOutputStream();

        response.setContentType("aplication/force-download");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + f.getName() + "\"");
        response.setContentLength((int) f.length());

        int data;
        while((data = fis.read()) != -1)
        {
            os.write(data);
        }

        fis.close();
        os.close();

        return null;
    }

    private ModelAndView obtenerRequisitosPorModalidad(HttpServletRequest request, HttpServletResponse response)
    {
        Map<String, Object> model = new HashMap<String,Object>();

        Integer codigoModalidad = Integer.parseInt(request.getParameter("modalidad"));

        List<Requisito> requisitos = getCatalogoService().obtenerRequisitosPorModalidad(codigoModalidad);
        List<Modalidad> modalidades = getCatalogoService().obtenerModalidades();

        model.put("modalidades", modalidades);
        model.put("requisitos", requisitos );

        return new ModelAndView("postulante_Fase_2", model);
    }

    private boolean esAccionCargar(HttpServletRequest request)
    {
        return ACCION_CARGAR.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionDescargar(HttpServletRequest request)
    {
        return ACCION_DESCARGAR.equals(request.getParameter(PARAMETRO_ACCION));
    }

    private boolean esAccionVerRequisitosModalidad(HttpServletRequest request)
    {
        return ACCION_VER_REQUISITOS_MODALIDAD.equals(request.getParameter(PARAMETRO_ACCION));
    }
}